#include <stdio.h>
#include <unistd.h>

#include "ohos_init.h"
#include "cmsis_os2.h"

#include "gd32h7xx.h"
#include "systick.h"
#include "gd32h759i_eval.h"

#define THREAD_DELAY_1S 1000000

#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"


void test(void)
{
    uint8_t t;
    uint8_t len;	
    uint16_t times = 0;
  
    sys_cache_enable();                     /* 使能CPU cache */
    delay_init(600);                        /* 延时初始化 */
    usart_init(115200);                     /* 初始化USART1串口 */
    led_init();							    /* 初始化LED */   
    
    while(1)
    {        
        if (g_usart_rx_sta & 0x8000)        /* 接收完了一次数据 */
        {
            len = g_usart_rx_sta & 0x3fff;  /* 得到此次接收到的数据长度 */
            printf("\r\n您发送的消息为:\r\n");

            // 将接收到的数据以字符串形式打印到终端
            g_usart_rx_buf[len] = '\0'; // 添加字符串结束符
            printf("%s\r\n", g_usart_rx_buf);

            for (t = 0; t < len; t++)
            {
                while(RESET == usart_flag_get(USART_UX, USART_FLAG_TC)); /* 等待发送完成 */
                usart_data_transmit(USART_UX, g_usart_rx_buf[t]);        /* 发送接收到的数据 */                
            }

            printf("\r\n\r\n"); /* 插入换行 */  
            g_usart_rx_sta = 0;
        }
        else
        {
            times++;

            if (times % 5000 == 0)
            {
                printf("\r\n慧勤智远 GD32H759IMT6小系统板 串口实验\r\n");
                printf("慧勤智远@Waiken-Smart\r\n\r\n\r\n");
            }

            if (times % 200 == 0)
            {
                printf("请输入数据,以回车键结束\r\n");  
            }

            if (times % 30 == 0) 
            {
                LED0_TOGGLE(); /* 闪烁LED0,提示系统正在运行. */
            }

            delay_ms(10);   
        } 
    }


    // gd_eval_led_init(LED1);
    // gd_eval_led_init(LED2);
    // while(1)
    // { 
    //    printf("GpioTask: LED\n");
    //    gd_eval_led_toggle(LED1);
    //    gd_eval_led_toggle(LED2);
    //    //usleep(THREAD_DELAY_1S);

    //    //GD32H759IMT6的bsp提供的延时函数
    //    delay_us(1000*1000*2);
    //    delay_ms(1000);
    // }

}

static void testTask(void)
{
    osThreadAttr_t attr;

    attr.name = "led_test";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 20*1024;
    attr.priority = osPriorityNormal;

    if (osThreadNew((osThreadFunc_t)test, NULL, &attr) == NULL) {
        printf("[testTask] Falied to create Task!\n");
    }
}
APP_FEATURE_INIT(testTask);